home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
Libraries
/
Dots & Pixels
/
sources
/
recorder.cp
< prev
next >
Wrap
Text File
|
1995-09-29
|
5KB
|
178 lines
#include <assert.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <QDOffscreen.h>
#include <Memory.h>
#include <Fonts.h>
#include <Packages.h>
#include <SegLoad.h>
#include <ToolUtils.h>
#include <TextEdit.h>
#include <Movies.h>
#include "general.h"
#include "port.h"
#include "gworld.h"
#include "recorder.h"
recorder::recorder( char *filename,
gworld *theWorld, // defines size of movie
long framerate,
long compressiontype,
int keyframedistance, // 0 implies no frame differencing
long compressionquality, // 0x100 thru 0x300 allowed
long temporalquality)
{
myworld = theWorld;
myframerate = framerate;
mycompressiontype = compressiontype;
mykeyframedistance = keyframedistance;
mycompressionquality = compressionquality;
mytemporalquality = temporalquality;
theWorld->get_rect( &movieFrame);
theWorld->get_pixH( &thepix);
const int movieWidth = movieFrame.right - movieFrame.left;
const int movieHeight = movieFrame.bottom - movieFrame.top;
movieDepth = theWorld->diepte();
sequence_running = false;
const short default_volume = 0;
#ifdef applec
c2pstr( filename);
#else
CtoPstr( filename);
#endif
OSErr error = FSMakeFSSpec( default_volume, 0, (ConstStr255Param)filename, &myFSSpec);
CheckForError( !((error == fnfErr) || (error == noErr)), "FSMakeFSSpec");
error = CreateMovieFile( &myFSSpec, 'TVOD', 0,
createMovieFileDeleteCurFile, &myResFileNo, &myMovie);
CheckForError( error, "CreateMovieFile");
myTrack = NewMovieTrack( myMovie, movieWidth << 16, movieHeight << 16, 0);
CheckForError( GetMoviesError(), "NewMovieTrack");
myMedia = NewTrackMedia( myTrack, VideoMediaType, myframerate, nil, (OSType) nil);
CheckForError( GetMoviesError(), "NewTrackMedia");
error = BeginMediaEdits( myMedia);
CheckForError( GetMoviesError(), "BeginMediaEdits");
myImageDescriptionHandle = (ImageDescriptionHandle)NewHandle( 4);
CheckForError( (myImageDescriptionHandle == 0), "NewHandle( 4)");
error = GetMaxCompressionSize( &thepix, &movieFrame, movieDepth,
mycompressionquality, mycompressiontype, anyCodec, &maxCompressedFrameSize);
CheckForError( error, "GetMaxCompressionSize");
myFrameBitsHandle = NewHandle( maxCompressedFrameSize);
CheckForError( (myFrameBitsHandle == 0), "NewHandle");
HLock( myFrameBitsHandle);
}
void recorder::StartSequence()
{
if( sequence_running)
{
DebugStr( "\pStartSequence called while one is running. Exiting!");
exit( EXIT_FAILURE);
} else {
sequence_running = true;
}
OSErr error;
error = CompressSequenceBegin( &mySequence, &thepix, nil, &movieFrame, nil, movieDepth,
mycompressiontype, anyCodec, mycompressionquality, mytemporalquality,
mykeyframedistance, nil, (unsigned short)codecFlagUpdatePrevious,
myImageDescriptionHandle);
CheckForError( error, "CompressSequenceBegin");
}
void recorder::EndSequence()
{
if( !sequence_running)
{
DebugStr( "\pEndSequence called while none is running. Exiting!");
exit( EXIT_FAILURE);
} else {
sequence_running = false;
}
OSErr error;
error = CDSequenceEnd( mySequence);
CheckForError( error, "CDSequenceEnd");
}
recorder::~recorder()
{
if( sequence_running)
{
DebugStr( "\precorder::~recorder called while a sequence is running. Exiting!");
exit( EXIT_FAILURE);
}
short resourceID = 1;
OSErr error;
error = EndMediaEdits( myMedia );
CheckForError( error, "EndMediaEdits");
error = InsertMediaIntoTrack( myTrack, 0L, 0L, GetMediaDuration( myMedia), (Fixed)(1<<16));
CheckForError( error, "InsertMediaIntoTrack");
error = AddMovieResource( myMovie, myResFileNo, &resourceID, myFSSpec.name);
CheckForError( error, "AddMovieResource");
error = MakeFilePreview( myResFileNo, (ICMProgressProcRecordPtr)-1);
CheckForError( error, "MakeFilePreview");
error = CloseMovieFile( myResFileNo);
CheckForError( error, "CloseMovieFile");
DisposeMovie( myMovie);
DisposeHandle( myFrameBitsHandle);
DisposeHandle( (Handle)myImageDescriptionHandle);
}
void recorder::AddFrame( TimeValue duration)
{
if( !sequence_running)
{
DebugStr( "\pAddFrame called while no sequence is running. Exiting!");
exit( EXIT_FAILURE);
}
long CompressedFrameSize = maxCompressedFrameSize;
unsigned char similarity;
OSErr error = CompressSequenceFrame( mySequence, &thepix, &movieFrame,
(unsigned short)codecFlagUpdatePrevious, StripAddress( *myFrameBitsHandle),
&CompressedFrameSize, &similarity, nil);
CheckForError( error, "CompressSequenceFrame");
//
// pascal OSErr AddMediaSample(Media m,Handle dataIn,long inOffset,unsigned long size,
// TimeValue durationPerSample,SampleDescriptionHandle sampleDescriptionH,
// long numberOfSamples,short sampleFlags,TimeValue *sampleTime)
// = {0x303C,0x7C,0xAAAA};
//
error = AddMediaSample( myMedia, myFrameBitsHandle, 0L, CompressedFrameSize,
duration, (SampleDescriptionHandle)myImageDescriptionHandle, 1L,
similarity ? mediaSampleNotSync : 0, &sampTime);
CheckForError( error, "AddMediaSample");
}